package com.test;

import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.setting.dialect.Props;
import com.component.CustomInfo;
import com.component.yhqProperties;
import org.slf4j.Logger;

import java.io.*;
import java.util.Arrays;
import java.util.Date;
import java.util.List;


/**
 * 实现文件的拷贝  不独有文件拷贝
 */
public class CopyFile {
    static  Logger log = org.slf4j.LoggerFactory.getLogger(CopyFile.class);

    public static void main(String[] args) {

        CopyFile copyFile = new CopyFile();

//        try {
//            copyFile.copyFolder("\\\\192.168.7.215\\ECOLOGY_customer\\A\\A安徽全柴集团\\QC1426401\\ecology", "C:\\Users\\Administrator\\Desktop\\test", true);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }

        Props props = new Props("E:\\ecology\\shanxishengguotuziyuanjianyiting\\ecology"+"\\WEB-INF\\prop\\weaver.properties");
        System.out.println(props.get("ecology.url"));
        props.setProperty("ecology.url",String.valueOf(props.get("ecology.url")).replace("127.0.0.1","10.10.34.234"));
        System.out.println(props.get("ecology.url"));

    }

    /**
     * 复制文件夹
     *
     * @param resource 源路径
     * @param target   目标路径
     *                 root  是否为根目录覆盖
     */
    public static void copyFolder(String resource, String target, boolean root) throws Exception {

        File resourceFile = new File(resource);
        if (!resourceFile.exists()) {
            throw new Exception("源目标路径：[" + resource + "] 不存在...");
        }
        File targetFile = new File(target);
        if (!targetFile.exists()) {
            throw new Exception("存放的目标路径：[" + target + "] 不存在...");
        }

        // 获取SVN文件夹下的文件夹或文件
        File[] targetFiles = targetFile.listFiles();

        for (File file : targetFiles) {
            if (root &&  file.getPath().equals(target+"\\classbean")) {//隐藏文件不做操作
                log.info("标准包，未覆盖classbean" +target+"\\classbean");
                continue;
            }
            File file1 = new File(file.getPath().replace(target, resource));//源文件
            // 复制文件
            if (file.isFile()) {
                log.info("文件" + file.getName());
                // 在 目标文件夹（B） 中 新建 源文件夹（A），然后将文件复制到 A 中
                // 这样 在 B 中 就存在 A
                if (!file1.exists()) {
                    //file1.mkdirs();
                    continue;
                }
                //File targetFile1 = new File(file1.getAbsolutePath() + File.separator + file.getName());
                copyFile(file1, file);

            }
            // 复制文件夹
            if (file.isDirectory()) {// 复制源文件夹
                if (!file1.exists()) {
                    //file1.mkdirs();
                    continue;
                }
                String dir1 = file.getAbsolutePath();
                // 目的文件夹
                String dir2 = file1.getAbsolutePath();
                copyFolder(dir2, dir1, false);
            }
        }

    }

    /**
     * 复制文件
     *
     * @param resource
     * @param target
     */
    public static void copyFile(File resource, File target) throws Exception {
        // 输入流 --> 从一个目标读取数据
        // 输出流 --> 向一个目标写入数据

        log.info(resource + "---" + target);
        long start = System.currentTimeMillis();

        // 文件输入流并进行缓冲
        FileInputStream inputStream = new FileInputStream(resource);
        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);

        // 文件输出流并进行缓冲
        FileOutputStream outputStream = new FileOutputStream(target);
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);

        // 缓冲数组
        // 大文件 可将 1024 * 2 改大一些，但是 并不是越大就越快
        byte[] bytes = new byte[1024 * 2];
        int len = 0;
        while ((len = inputStream.read(bytes)) != -1) {
            bufferedOutputStream.write(bytes, 0, len);
        }
        // 刷新输出缓冲流
        bufferedOutputStream.flush();
        //关闭流
        bufferedInputStream.close();
        bufferedOutputStream.close();
        inputStream.close();
        outputStream.close();

        long end = System.currentTimeMillis();

        log.info("耗时：" + (end - start) / 1000 + " s");

    }


    /**
     * 复制标准文件(独有文件覆盖)
     *
     * @param split        提交文件路径
     * @param standardPath 标准包路径
     * @param checkoutPath 本地svn 路径
     * @param filePath     历史文件路径
     */

    public static void copyFileSvn(String[] split, String standardPath, String checkoutPath, String filePath) throws Exception {
        for (String path : split) {
            //path 开发环境的文件路径
            //获取文件相对地址
            int index = path.lastIndexOf("\\ecology\\");
            if (index > 0) {
                String substring = path.substring(index + 8);
                //文件输入源
                File file = new File(standardPath + substring);
                //标准包有该文件
                if (file.exists()) {

                } else {
                    //标准包没有，去历史文件中取。
                    file = new File(filePath + substring);
                }
                String outPath = checkoutPath + substring;
                //文件输出源
                File fileOut = new File(outPath);

                if (fileOut.exists()) {
                    //本地svn工作副本，存在该文件，无需提交标准文件。
                    //File file1 = new File(path);
                    //svn存在，覆盖本地文件到svn
                    //copyFile(file1, fileOut);
                } else {
                    //历史文件或标准文件存在，进行复制。
                    if (file.exists()){
                    int i = outPath.lastIndexOf("\\");
                    //获取文件名称
                    String substring1 = outPath.substring(0, i);
                    //创建目录
                    File file1 = new File(substring1);
                    if (!file1.exists()) {
                        file1.mkdirs();
                    }
                    //创建文件夹
                    fileOut.createNewFile();
                        copyFile(file, fileOut);
                    }
                }
            }
        }
    }

    /**
     * 复制本地副本文件到svn
     *
     * @param split        提交文件路径
     * @param checkoutPath checkoutPath 本地svn 路径
     */
    public static void copyFileSvn(String[] split, String checkoutPath) throws Exception {



        for (String path : split) {
            //path 开发环境的文件路径
            //获取文件相对地址
            int index = path.lastIndexOf("\\ecology\\");
            if (index > 0) {
                String substring = path.substring(index + 8);
                //文件输入源
                File fileInput = new File(path);
                //文件输入地址
                File fileOutPut = new File(checkoutPath + substring);

                if (fileOutPut.exists()) {
                    copyFile(fileInput, fileOutPut);

                } else {
                    //是新增文件
                    String pathOutPut = checkoutPath + substring;
                    int i = pathOutPut.lastIndexOf("\\");
                    //创建目录
                    File file = new File(pathOutPut.substring(0, i));
                    //文件夹不存在直接创建
                    if (!file.exists()) {
                        file.mkdirs();
                    }
                    //创建文件
                    File file1 = new File(pathOutPut);
                    file1.createNewFile();
                    copyFile(fileInput, fileOutPut);
                }
            }

        }
    }


    /**
     * 复制测试环境代码到本地搭建环境
     */
    public static void copyEcology(CustomInfo customInfo, yhqProperties yhqProperties,String mySelect) throws Exception {

        List<String> list=Arrays.asList("data","src4js","src4js-mobiletool-v1","src4js-pctool-v1");

        log.info("copyEcology info");
        Date begin = new Date();

        log.info("customInfo.getVmIP() + ---" +  "\\\\" + customInfo.getVmIP() + "\\weaver\\ecology");
        File src =new File("\\\\" + customInfo.getVmIP() + "\\weaver\\ecology");
        File target =new File(customInfo.getLocalOa()+"\\ecology");
        //复制测试环境文件到本地；
        if (!src.exists()) {
            throw new Exception("源目标路径：[" + src + "] 不存在...");
        }
        if (!target.exists()) {
            target.mkdirs();
            log.info("创建目录"+target.getName());
        }
        File[] files1 = src.listFiles();

        for (File file : files1) {
            //重新添加已经排除的文件
            if ("12".equals(mySelect)){
                if(file.isDirectory()&&list.contains(file.getName())&&!file.getName().equals("data")){
                    log.info(file.getPath()+"--12->"+target.getPath());
                    FileUtil.copy(file,target,false);
                    log.info(file.getPath());

                }
                continue;
            }
            if (file.isDirectory()&&list.contains(file.getName())){
                log.info("过滤的目录"+file.getName());
                continue;
            }
            log.info(file.getPath()+"--9->"+target.getPath());
            FileUtil.copy(file,target,false);
            log.info(file.getPath());
        }
        //给本地测试环境  添加resin 及 license
        //判断客户使用的resin版本，为其添加e8 还是e9 的resin 及 license
        String sysVersionName = customInfo.getSysVersionName();

        String ecologyResinPath="";
        log.info("sysVersionName->"+sysVersionName);
        if (sysVersionName.startsWith("9")){
            ecologyResinPath=yhqProperties.getEcologyResin9();
        }else {
            ecologyResinPath=yhqProperties.getEcologyResin8();
        }
        File ecologyResin = new File(ecologyResinPath);
        File[] files = ecologyResin.listFiles();
        File fileLocalOa = new File(customInfo.getLocalOa());
        for (File file : files) {
            FileUtil.copy(file,fileLocalOa,false);
        }
        Date end = new Date();

        //拼接 weaver.properties 的路径，

        log.info("url="+customInfo.getLocalOa()+"\\ecology\\WEB-INF\\prop\\weaver.properties");
        Props props = new Props(customInfo.getLocalOa()+"\\ecology\\WEB-INF\\prop\\weaver.properties");
        log.info("begin eoclogy.url="+props.get("ecology.url"));
        log.info("begin customInfo.getVmIP()="+customInfo.getVmIP());
        log.info("ecology.url"+String.valueOf(props.get("ecology.url")).replace("127.0.0.1",customInfo.getVmIP()));
        props.setProperty("ecology.url",String.valueOf(props.get("ecology.url")).replace("127.0.0.1",customInfo.getVmIP()));
        props.store(customInfo.getLocalOa()+"\\ecology\\WEB-INF\\prop\\weaver.properties");
        log.info("end eoclogy.url="+props.get("ecology.url"));
        //读取ecology.url键的值 替换 127.0.0.1
        log.info(DateUtil.between(begin, end, DateUnit.MINUTE)+"分钟");
        log.info(DateUtil.between(begin, end, DateUnit.SECOND)+"秒");
        throw new Exception("用时"+DateUtil.between(begin, end, DateUnit.MINUTE)+"分钟");
     }



  }

